package sess

import "gitee.com/night-tc/gobige/logger"

/*
连接服务管理器
*/

type INetServer interface {
	//主要给INetSess调用的方法，也可以重载
	ISessCallBack

	/* 外部函数 */

	// //开始服务
	// Start() (err error)
	// //结束服务
	// Stop()
	// 遍历所有被动连接，返回false就退出遍历
	RangeSess(f func(sess INetSess) bool)
	// 获取会话
	GetClientSess(id uint64) (result *NetSess)
	//是否加密
	GetEncryEnabled() bool
	//连接类型
	GetProtocal() ProtocalEnum
}

////////////////////////////////////////////////////////////////////
/* 外部函数 */

// 开始服务
func (this *NetSrv) Start() (err error) {

	switch this.protocal {
	case Protocal_Tcp, Protocal_Kcp:
		this.thgo.Go(this.acceptConn)
	case Protocal_WebSocket:
		this.thgo.Go(this.websocketacceptConn)
	default:
		return Err_Unknown_ProtocalEnum.NewErr(nil, this.protocal)
	}
	return nil
}

// 结束服务
func (this *NetSrv) Stop() {
	this.sessesByID.Range(func(key, value any) bool {
		value.(INetSess).Close()
		return true
	})
	this.listener.Close()
	logger.Info("NetSrv Stop")
	this.thgo.CloseWait()
}

// 遍历所有被动连接，返回false就退出遍历
func (this *NetSrv) RangeSess(f func(sess INetSess) bool) {
	this.sessesByID.Range(func(key, value any) bool {
		return f(value.(INetSess))
	})
}

// 获取会话
func (this *NetSrv) GetClientSess(id uint64) (result *NetSess) {
	if v, ok := this.sessesByID.Load(id); ok {
		result = v.(*NetSess)
	}
	return
}

// 是否加密
func (this *NetSrv) GetEncryEnabled() bool {
	return this.encryEnabled
}

// 连接类型
func (this *NetSrv) GetProtocal() ProtocalEnum {
	return this.protocal
}

/* 外部函数 */
////////////////////////////////////////////////////////////////////
